/* eslint-disable indent */
'use strict'

const dayjs = require('dayjs')

/**
 * 用户是否已登录判断和异常捕获处理
 * @param {*} options 中间件的配置项，框架会将 app.config.middlewareName 传递进来
 * @param {*} app Application 实例
 */
module.exports = (options, app) => {
    return async (ctx, next) => {
        if (!ctx.url.startsWith(app.config.apiPrefix)) {
            // 非api接口
            await next()
            return
        }

        const whiteUrls = options.whiteUrls || []
        // 如果 ctx.url 在白名单中
        const isWhiteUrl = whiteUrls.some(whiteUrl => ctx.url.startsWith(whiteUrl))
        if (isWhiteUrl) {
            // 白名单URL
            // console.log('白名单', ctx.url)
            await next()
        } else {
            // 校验token
            let token = null
            if (ctx.headers.authorization && ctx.headers.authorization.split(' ')[0] === 'Bearer') {
                token = ctx.headers.authorization.split(' ')[1]
            }

            if (token) {
                if (ctx.helper.verifyToken(token)) {
                    await next()
                }
            } else {
                ctx.status = 200
                ctx.body = {
                    code: 401,
                    message: '用户token不存在'
                }
            }
        }
    }
}
